/**
 * idcode 1.0 - validate user.
 * Version 1.0
 * @requires jQuery v1.2
 * author ehong[idehong@gmail.com]
 **/

/**
 * @example: $.idcode.setCode();        
 * @desc: Make a validate code append to the element that id is idcode.
 *
 * @example $.idcode.validateCode();    
 * @desc return true if user input value equal idcode. 
 **/
 
(function($){
        var settings = {
                        e                       : 'idcode',
                        codeType        : { name : 'follow', len: 4},
                        codeTip         : '',
                        inputID         : ''
                };
        
        var _set = {
                storeLable  : 'codeval',
                store           : '#ehong-code-input',
                codeval         : '#ehong-code'
        }
        $.idcode = {
                getCode:function(option){
                        _commSetting(option);
                        return _storeData(_set.storeLable, null);
                },
                setCode:function(option){
                        _commSetting(option);
                        _setCodeStyle("#"+settings.e, settings.codeType.name, settings.codeType.len);
                        
                },
                validateCode:function(option){
                        _commSetting(option);
                        var inputV;
                        if(settings.inputID){
                                inputV=$('#' + settings.inputID).val();
                        }else{
                                inputV=$(_set.store).val();
                        }
                        
                        if(inputV == _storeData(_set.storeLable, null)){
                                return true;
                        }else{
                                _setCodeStyle("#"+settings.e, settings.codeType.name, settings.codeType.len);                           
                                return false;
                        }
                }
        };
        
        function _commSetting(option){
                $.extend(settings, option);             
        }
        
        function _storeData(dataLabel, data){
                var store = $(_set.codeval).get(0);                     
                if(data){
                        $.data(store, dataLabel, data);                 
                }else{
                        return $.data(store, dataLabel);                        
                }
        }
        
        function _setCodeStyle(eid, codeType, codeLength){
                var codeObj = _createCode(settings.codeType.name, settings.codeType.len);               
                var randNum = Math.floor(Math.random()*6);
                var htmlCode=''
                if(!settings.inputID){
                        htmlCode='<span><input id="ehong-code-input" type="text" maxlength="4" /></span>';
                }
                htmlCode+='<span id="ehong-code" style="font-size: larger;padding:4px 10px 6px 10px;margin-left:10px;cursor: pointer;border: 1px;background-color: #F7FDFF;" class="ehong-idcode-val ehong-idcode-val';
                htmlCode+=String(randNum);
                htmlCode+='" href="#" onblur="return false" onfocus="return false" oncontextmenu="return false" onclick="$.idcode.setCode()">' + _setStyle(codeObj) + '</span>' + '<span id="ehong-code-tip-ck" class="ehong-code-val-tip" onclick="$.idcode.setCode()">'+ settings.codeTip +'</span>';
                $(eid).html(htmlCode);
                _storeData(_set.storeLable, codeObj);           
        }
        
        function _setStyle(codeObj){
                var fnCodeObj = new Array();
                var col = new Array('#BF0C43', '#E69A2A','#707F02','#18975F','#BC3087','#73C841','#780320','#90719B','#1F72D8','#D6A03C','#6B486E','#243F5F','#16BDB5');
                var charIndex;
                for(var i=0;i<codeObj.length;i++){              
                        charIndex = Math.floor(Math.random()*col.length);
                        fnCodeObj.push('<font color="' + col[charIndex] + '">' + codeObj.charAt(i) + '</font>');
                }
                return fnCodeObj.join('');              
        }
        function _createCode(codeType, codeLength){
           var codeObj;
           if(codeType=='follow'){
                   codeObj = _createCodeFollow(codeLength);
           }else if(codeType=='calc'){
                   codeObj = _createCodeCalc(codeLength);
           }else{
                   codeObj="";
           }
           return codeObj;   
         }
         
         function _createCodeCalc(codeLength){
           var code1, code2, codeResult;
           var selectChar = new Array('0','1','2','3','4','5','6','7','8','9'); 
           var charIndex;
           for(var i=0;i<codeLength;i++){               
                   charIndex = Math.floor(Math.random()*selectChar.length);
                   code1 +=selectChar[charIndex];
                   
                   charIndex = Math.floor(Math.random()*selectChar.length);
                   code2 +=selectChar[charIndex];                  
           }
           return [parseInt(code1), parseInt(code2) , parseInt(code1) + parseInt(code2)] ;
         }
         
         function _createCodeFollow(codeLength){
           var code = "";
           var selectChar = new Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
                
           for(var i=0;i<codeLength;i++){               
                   var charIndex = Math.floor(Math.random()*selectChar.length);
                   if(charIndex % 2 == 0){
                           code+=selectChar[charIndex].toLowerCase();
                   }else{
                           code +=selectChar[charIndex].toLowerCase();
                   }       
           }
           return code;
         }
   
})(jQuery);
